package com.xixi.core.rpc.server.tcp;

import com.xixi.core.rpc.server.CustomHttpServer;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;
import io.vertx.core.parsetools.RecordParser;

/**
 * @author: zxh
 * @date: 2024/8/26 11:08
 * @description: 基于Vert.x的TCP传输（服务端）
 */
public class VertxTcpServer implements CustomHttpServer {

	private byte[] handleRequest(byte[] requestData) {
		// 示例
		return "Hello ,client!".getBytes();
	}

	@Override
	public void doStart(int port) {
		// 创建Vert.x的实例
		Vertx vertx = Vertx.vertx();

		// 创建TCP服务器
		NetServer server = vertx.createNetServer();

		// 请求处理
		// server.connectHandler(socket -> {
		// 	// 处理连接
		// 	socket.handler(buffer -> {
		// 		String testMessage = "Hello, server! Hello, server! Hello, server! Hello, server!";
		// 		int messageLength = testMessage.getBytes().length;
		// 		if (buffer.getBytes().length < messageLength) {
		// 			System.out.println("半包，length= " + buffer.getBytes().length);
		// 			return;
		// 		}
		// 		if (buffer.getBytes().length > messageLength) {
		// 			System.out.println("粘包，length= " + buffer.getBytes().length);
		// 			return;
		// 		}
		//
		// 		String str = new String(buffer.getBytes(0, messageLength));
		// 		System.out.println(str);
		// 		if (testMessage.equals(str)) {
		// 			System.out.println("good");
		// 		}
		//
		// 		// 处理接收到的字节数组
		// 		// byte[] requestData = buffer.getBytes();
		// 		// 在这里进行自定义的字节数组处理逻辑，解析请求等
		// 		// byte[] responseData = handleRequest(requestData);
		// 		// 发送响应
		// 		// socket.write(Buffer.buffer(responseData));
		// 	});
		// });

		/*server.connectHandler(socket -> {
			// 构造parser
			RecordParser parser = RecordParser.newFixed(8);
			parser.setOutput(new Handler<Buffer>() {
				// 初始化
				int size = -1;
				// 一次完整的读取（头 + 体）
				Buffer resultBuffer = Buffer.buffer();

				@Override
				public void handle(Buffer event) {
					if (-1 == size) {
						// 读取消息体长度
						int a = event.getInt(0);
						size = event.getInt(4);
						System.out.println("size: " + size);
						parser.fixedSizeMode(size);
						// 写入头信息到结果
						resultBuffer.appendBuffer(event);
					} else {
						// 写入体信息到结果
						resultBuffer.appendBuffer(event);
						System.out.println(resultBuffer.toString());
						// 重置一轮
						parser.fixedSizeMode(8);
						size = -1;
						resultBuffer = Buffer.buffer();
					}
					// String str = new String(event.getBytes());
					// System.out.println(str);
					// if (testMessage.equals(str)) {
					// 	System.out.println("good");
					// }
				}
			});

			socket.handler(parser);

			// 处理连接
			*//*socket.handler(buffer -> {

				if (buffer.getBytes().length < messageLength) {
					System.out.println("半包，length= " + buffer.getBytes().length);
					return;
				}
				if (buffer.getBytes().length > messageLength) {
					System.out.println("粘包，length= " + buffer.getBytes().length);
					return;
				}

				String str = new String(buffer.getBytes(0, messageLength));
				System.out.println(str);
				if (testMessage.equals(str)) {
					System.out.println("good");
				}

				// 处理接收到的字节数组
				// byte[] requestData = buffer.getBytes();
				// 在这里进行自定义的字节数组处理逻辑，解析请求等
				// byte[] responseData = handleRequest(requestData);
				// 发送响应
				// socket.write(Buffer.buffer(responseData));
			});*//*
		});*/

		server.connectHandler(new TcpServerHandler());

		// 启动TCP服务器并监听指定端口
		server.listen(port, result -> {
			if (result.succeeded()) {
				System.out.println("TCP server started on port " + port);
			} else {
				System.out.println("Failed to start TCP server: " + result.cause());
			}
		});
	}

	public static void main(String[] args) {
		new VertxTcpServer().doStart(8888);
	}
}
